package com.guomao.document;

import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.Setting;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;

/**
 * 商品信息ES文档实体类
 * 用于将商品数据存储到Elasticsearch中，支持全文搜索和复杂查询
 *
 * @author Your Name
 * @version 1.0
 * @since 2024
 */
@Data // Lombok注解：自动生成getter、setter、toString、equals、hashCode等方法
@EqualsAndHashCode // Lombok注解：自动生成equals和hashCode方法
@Document(indexName = "pms") // Elasticsearch注解：指定该实体类对应的索引名称为"pms"
@Setting(shards = 1, replicas = 0) // Elasticsearch注解：设置索引分片数为1，副本数为0（适用于开发测试环境）
public class EsProduct implements Serializable {

    /**
     * 序列化版本UID，用于保证序列化兼容性
     */
    private static final long serialVersionUID = -1L;

    /**
     * 商品ID - 主键标识
     * Elasticsearch文档的唯一标识符
     */
    @Id // Spring Data Elasticsearch注解：标识该字段为文档ID
    private Long id;

    /**
     * 商品货号
     * 使用Keyword类型进行精确匹配，不支持分词
     */
    @Field(type = FieldType.Keyword) // Elasticsearch字段注解：指定字段类型为Keyword
    private String productSn;

    /**
     * 品牌ID
     */
    private Long brandId;

    /**
     * 品牌名称
     * 使用Keyword类型进行精确匹配，如按品牌名称精确筛选
     */
    @Field(type = FieldType.Keyword)
    private String brandName;

    /**
     * 商品分类ID
     */
    private Long productCategoryId;

    /**
     * 商品分类名称
     * 使用Keyword类型进行精确匹配
     */
    @Field(type = FieldType.Keyword)
    private String productCategoryName;

    /**
     * 商品主图
     * 存储商品图片的URL地址
     */
    private String pic;

    /**
     * 商品名称
     * 使用IK分词器的ik_max_word模式进行细粒度分词，支持全文搜索
     * 例如："智能手机"会被分成"智能"、"手机"、"智能手机"等多个词条
     */
    @Field(analyzer = "ik_max_word", type = FieldType.Text)
    private String name;

    /**
     * 商品副标题
     * 同样使用IK分词器进行细粒度分词，支持全文搜索
     */
    @Field(analyzer = "ik_max_word", type = FieldType.Text)
    private String subTitle;

    /**
     * 商品关键词
     * 用于商品搜索的关键词，使用IK分词器进行分词
     */
    @Field(analyzer = "ik_max_word", type = FieldType.Text)
    private String keywords;

    /**
     * 商品价格
     * 使用BigDecimal类型保证价格计算的精确性
     */
    private BigDecimal price;

    /**
     * 销量
     * 商品销售数量，用于排序和统计
     */
    private Integer sale;

    /**
     * 新品状态
     * 0->不是新品；1->新品
     */
    private Integer newStatus;

    /**
     * 推荐状态
     * 0->不推荐；1->推荐
     */
    private Integer recommandStatus;

    /**
     * 库存
     * 商品库存数量
     */
    private Integer stock;

    /**
     * 促销类型
     * 0->使用原价；1->促销价格
     */
    private Integer promotionType;

    /**
     * 商品排序字段
     * 数值越小排序越靠前
     */
    private Integer sort;

    /**
     * 商品属性值列表
     * 使用Nested类型存储商品属性，保持属性值的独立性
     * Nested类型可以确保数组中的每个对象被独立索引和查询
     * 例如：颜色、尺寸、内存等属性
     */
    @Field(type = FieldType.Nested) // Elasticsearch注解：指定字段类型为Nested，用于存储对象数组
    private List<EsProductAttributeValue> attrValueList;

    /**
     * 默认构造函数
     */
    public EsProduct() {
        // 默认构造函数
    }

    /**
     * 带参构造函数 - 用于快速创建商品对象
     *
     * @param id 商品ID
     * @param name 商品名称
     * @param price 商品价格
     */
    public EsProduct(Long id, String name, BigDecimal price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }
}